Стандартные потоки ввода и вывода
===================================

До сих пор печатный вывод наших программ отображался в окне терминала
(или на экране). Хотя терминал часто является конечной целью вывода,
это не всегда так. Объекты, которые могут принимать данные, называются стандартными
выходными потоками.

Стандартный вывод основан на символах; все, что должно быть напечатано, сначала
преобразуется в соответствующее символьное представление, а затем отправляется на
вывод в виде символов. Например, целое значение 100, которое мы напечатали в
последняя глава отправляется на вывод не как значение 100, а как три символа
1, 0 и 0.

Аналогично, то, что мы обычно воспринимаем как клавиатуру, на самом деле является стандартным
потоком ввода программы и также основано на символах. Информация всегда
поступает в виде символов, которые необходимо преобразовать в данные. Например, целое значение 42
фактически поступает через стандартный ввод в виде символов 4 и 2.
Эти преобразования происходят автоматически.

Эта концепция последовательных символов называется потоком символов. Поскольку
стандартный ввод и стандартный вывод языка D соответствуют этому описанию, они являются символьными
потоками.

Имена стандартных входных и выходных потоков в D -
#.  stdin - cтандартный поток ввода
#.  stdout стандартный поток вывода

.. index:: 
    stdin
    stdout

Для операций с этими потоками обычно требуется имя потока, точка
и операция, наприер

.. code-block:: d

    stream.operation().

Поскольку методы чтения stdin и методы записи stdout используются очень часто, эти операции могут
вызываться без указания имени потока и точки.
writeln, который мы использовали в предыдущих главах, на самом деле является сокращением от
stdout.writeln. Аналогично, write - это сокращение от stdout.write. Соответственно, программа
hello world также может быть написана следующим образом:

.. code-block:: d

    import std.stdio;

    void main()
    {
        stdout.writeln("Привет, мир!");
    }


Упражнение
------------

Обратите внимание, что stdout.write работает аналогично write. :ref:`Решение<ответы_к_главе_7>`
